home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Ken Long / SimpleWarp-c / Think & more / ButtonWarpƒ / ButtonWarp.c next >
Encoding:
C/C++ Source or Header  |  1994-12-04  |  4.6 KB  |  253 lines  |  [TEXT/KAHL]

  1. #include <math.h>
  2. #include "Warp.h"
  3.  
  4. #define kNumOfStars            70
  5. #define kProjDistance        450
  6. #define kLargeStar            0
  7. #define kSmallStar            1
  8.  
  9. Star        gStarField [kNumOfStars];
  10. int            gVelocity;
  11. Point        gOrigin;
  12. RgnHandle    gOldGrayRgn;
  13. short        gOldMBarHeight;
  14. WindowPtr    gWindow;
  15. RGBColor    starColor;
  16. Rect        starRect;
  17. long int    newLeft, newTop;
  18. EventRecord theEvent;
  19. Boolean doneFlag;
  20.  
  21. void main (void)
  22. {
  23.     short    loop;
  24.     OSErr        error;
  25.     SysEnvRec    theWorld;
  26.     
  27.     error = SysEnvirons(1, &theWorld);
  28.     if (theWorld.hasColorQD == false) 
  29.     {
  30.         SysBeep(50);
  31.         ExitToShell();    /* If no color QD, we must leave. */
  32.     }
  33.     
  34.     InitToolbox ();
  35.     InitStarField ();
  36.     HideCursor ();
  37.     
  38.     do 
  39.     {        
  40.         WaitNextEvent(everyEvent, &theEvent, 0L, 0L);
  41.         switch (theEvent.what) 
  42.         {
  43.             case mouseDown:
  44.                 do
  45.                 {
  46.                     AnimateStarField ();
  47.                 } while (Button ());
  48.             break;
  49.         
  50.             case mouseUp: 
  51.                 doneFlag = true;
  52.             break;
  53.         }
  54.     } while (! doneFlag);
  55.     
  56.     ShowCursor ();
  57. }
  58.  
  59. void InitToolbox (void)
  60. {
  61.     EventRecord        event;
  62.     short            count;
  63.     Rect            mBarRect;
  64.     RgnHandle        mBarRgn;
  65.     
  66.     InitGraf ((Ptr) &qd.thePort);
  67.     InitFonts ();
  68.     InitWindows ();
  69.     InitMenus ();
  70.     TEInit ();
  71.     InitDialogs (nil);
  72.     InitCursor ();
  73.     
  74.     GetDateTime((unsigned long*) &qd.randSeed);
  75.  
  76.     for (count = 1; count <= 3; ++count)
  77.         EventAvail (everyEvent, &event);
  78.     
  79.     gOldMBarHeight = GetMBarHeight ();
  80.     GetMBarHeight () = 0;
  81.  
  82.     gWindow = NewCWindow (nil, 
  83.                         &screenBits.bounds, 
  84.                          "\p", 
  85.                          true, 
  86.                          plainDBox, 
  87.                         (WindowPtr) -1, 
  88.                          false, 
  89.                          0);
  90.         
  91.     SetRect (&mBarRect, screenBits.bounds.left, screenBits.bounds.top,
  92.         screenBits.bounds.right, screenBits.bounds.top + gOldMBarHeight);
  93.  
  94.     mBarRgn = NewRgn ();
  95.     RectRgn (mBarRgn, &mBarRect);
  96.     UnionRgn (gWindow->visRgn, mBarRgn, gWindow->visRgn);
  97.     DisposeRgn (mBarRgn);
  98.     SetPort (gWindow);
  99.     FillRect (&gWindow->portRect, black);
  100. }
  101.  
  102. void InitStarField (void)
  103. {
  104.     short loop;
  105.     
  106.     starColor.red   = Random();
  107.     starColor.green = Random();
  108.     starColor.blue  = Random();
  109.     
  110.     RGBForeColor (&starColor);
  111.         
  112.     gVelocity = 6;
  113.     gOrigin.h = (screenBits.bounds.right - screenBits.bounds.left) / 2;
  114.     gOrigin.v = (screenBits.bounds.bottom - screenBits.bounds.top) / 2;
  115.     
  116.     for (loop = 0; loop < kNumOfStars; loop++) 
  117.     {
  118.         CreateStar (&gStarField [loop]);    
  119.     }
  120. }
  121.  
  122. void AnimateStarField (void)
  123. {
  124.     short    loop;
  125.     Point    location;
  126.     
  127.     for (loop = 0; loop < kNumOfStars; loop++) 
  128.     {
  129.         location = Project (gStarField [loop]);
  130.         
  131. //        RGBForeColor (&starColor);
  132.         ForeColor (blackColor);
  133.  
  134.         if (gStarField [loop].size == kLargeStar)
  135.             DrawLargeStar (location);
  136.         else
  137.             DrawSmallStar (location);
  138.         
  139.         AnimateStar (&gStarField [loop]);
  140.         
  141.         location = Project (gStarField [loop]);
  142. //        RGBForeColor (&starColor);
  143.         ForeColor (whiteColor);
  144.         
  145.         if (gStarField [loop].size == kLargeStar)
  146.             DrawLargeStar (location);
  147.         else
  148.             DrawSmallStar (location);
  149.     }
  150. }
  151.  
  152. void DrawLargeStar (Point aPt)
  153. {
  154.     Rect    starRect;
  155.     
  156.     starRect.left = aPt.h - 1;
  157.     starRect.right = aPt.h + 1;
  158.     starRect.top = aPt.v - 1;
  159.     starRect.bottom = aPt.v + 1;
  160.     
  161.     PaintRect (&starRect);
  162.     
  163.     RGBForeColor (&starColor);
  164. }
  165.  
  166. void DrawSmallStar (Point aPt)
  167. {
  168.     MoveTo (aPt.h, aPt.v);
  169.     LineTo (aPt.h, aPt.v);
  170.  
  171.     RGBForeColor (&starColor);
  172. }
  173.  
  174. Point Project (Star aStar)
  175. {
  176.     Point    starRect;
  177.     
  178.     starRect.h = aStar.x * kProjDistance / aStar.z + gOrigin.h;
  179.     starRect.v = aStar.y * kProjDistance / aStar.z + gOrigin.v;
  180.     
  181.     return starRect;
  182. }
  183.  
  184. void AnimateStar (Star *aStar)
  185. {
  186.     aStar->z = aStar->z - gVelocity;
  187.     if (aStar->z <= 0)
  188.         CreateStar (aStar);
  189.     
  190.      aStar->x = aStar->x - 0;
  191.     if (aStar->x <= 0)
  192.         CreateStar (aStar);
  193.     
  194.     aStar->y = aStar->y - 0;
  195.     if (aStar->y <= 0)
  196.         CreateStar (aStar);
  197. }
  198.  
  199. void CreateStar (Star *aStar)
  200. {
  201.     aStar->x = GetRandom (0, gOrigin.h);
  202.     if (GetRandom (0,1) == 0)
  203.         aStar->x = -aStar->x;
  204.         
  205.     aStar->y = GetRandom (0, gOrigin.v);
  206.     if (GetRandom (0,1) == 0)
  207.         aStar->y = -aStar->y;
  208.         
  209.     aStar->z = GetRandom (0, 150) + 125;
  210.     
  211.     aStar->size = GetRandom (0,1);
  212. }
  213.  
  214. unsigned short GetRandom(unsigned short min, unsigned short max)
  215. {
  216.     unsigned short random;
  217.     long range, starRect;
  218.  
  219.     random = Random();
  220.     range = (max - min) + 1;
  221.     starRect = (random * range) / 65536;
  222.     random = starRect + min;
  223.  
  224.     return random;
  225. }
  226. /*
  227. void NewBall()
  228. {
  229.     RGBColor    starColor;
  230.     Rect        starRect;
  231.     long int    newLeft, newTop;
  232.         
  233.     starColor.red   = Random();
  234.     starColor.green = Random();
  235.     starColor.blue  = Random();
  236.     
  237.     RGBForeColor (&starColor);
  238.     
  239.     newTop = Random();    newLeft = Random();
  240.     newTop = ((newTop+32767) * windRect.bottom)/65536;
  241.     newLeft = ((newLeft+32767) * windRect.right)/65536;
  242.     
  243.     SetRect(&starRect, 
  244.              newLeft, 
  245.              newTop, 
  246.              newLeft + BallWidth, 
  247.              newTop + BallHeight);
  248.         
  249.     MoveTo(newLeft, newTop);
  250.     PaintOval (&starRect);
  251.     RGBForeColor(&starColor);
  252. }
  253. */